#include <AVUIAffineTransform3D.h>

namespace AVUI {

class ScaleTransform3D : public AffineTransform3D
{
public:
    ScaleTransform3D() { };
    ~ScaleTransform3D() { }

    DECLARE_ELEMENT(ScaleTransform3D, AffineTransform3D);

    DECLARE_DEPENDENCY_PROPERTY(CenterX);
    float get_CenterX() { return AVUI::UnboxValue<float>(GetValue(get_CenterXProperty())); }
    void set_CenterX(float value) { SetValue(get_CenterXProperty(), AVUI::BoxValue(value)); } 

    DECLARE_DEPENDENCY_PROPERTY(CenterY);
    float get_CenterY() { return AVUI::UnboxValue<float>(GetValue(get_CenterYProperty())); }
    void set_CenterY(float value) { SetValue(get_CenterYProperty(), AVUI::BoxValue(value)); } 

    DECLARE_DEPENDENCY_PROPERTY(CenterZ);
    float get_CenterZ() { return AVUI::UnboxValue<float>(GetValue(get_CenterZProperty())); }
    void set_CenterZ(float value) { SetValue(get_CenterZProperty(), AVUI::BoxValue(value)); } 

    DECLARE_DEPENDENCY_PROPERTY(ScaleX);
    float get_ScaleX() { return AVUI::UnboxValue<float>(GetValue(get_ScaleXProperty())); }
    void set_ScaleX(float value) { SetValue(get_ScaleXProperty(), AVUI::BoxValue(value)); } 

    DECLARE_DEPENDENCY_PROPERTY(ScaleY);
    float get_ScaleY() { return AVUI::UnboxValue<float>(GetValue(get_ScaleYProperty())); }
    void set_ScaleY(float value) { SetValue(get_ScaleYProperty(), AVUI::BoxValue(value)); } 

    DECLARE_DEPENDENCY_PROPERTY(ScaleZ);
    float get_ScaleZ() { return AVUI::UnboxValue<float>(GetValue(get_ScaleZProperty())); }
    void set_ScaleZ(float value) { SetValue(get_ScaleZProperty(), AVUI::BoxValue(value)); } 

    virtual Matrix3D get_Value();

    virtual void Append(Matrix3D* pMatrix) AVUI_OVERRIDE
    {
        *pMatrix = *pMatrix * get_Value();
    }

protected:
    virtual TRefCountedPtr<Freezable> CreateInstanceCore() AVUI_OVERRIDE { return object_allocate<ScaleTransform3D>().get_Ptr(); }

private:
    static void StaticConstructor();

};


typedef TRefCountedPtr<ScaleTransform3D> ScaleTransform3DPtr;


}; // namespace AVUI
